from PIL import Image # pip install pillow
import sys

def read(file_name: str):
    '''
    Parameters
    ----------
    file_name : str
        文件路径(.bmp文件)
    
    Returns
    -------
    out : str
        十六进制像素数据。

    Notes
    -----
    读取 bmp 文件后，以从左到右、从上到下的顺序遍历所有像素并转换，最终返回像素矩阵对应的十六进制字符串。
    
    像素转换：将每个像素的 RGB 值以 4 位红色、4 位绿色、4 位蓝色的顺序转换，若颜色宽度大于 4 位，则取高 4 位，即每个像素点转换为 12 bit。
    '''

    with Image.open(file_name) as file:
        print("##### 读取信息 #####")
        print("格式：", "bmp")
        print("模式：", file.mode)
        print()
        # 检查模式
        if file.mode != 'RGB' and file.mode != 'RGBA':
            print("仅支持 RGB 或 RGBA 模式的 BMP 文件")
            sys.exit(0)

        width, height = file.size # 加载宽高值
        pixels = file.load() # 加载像素矩阵
        
        data=""
        for y in range(height):
            for x in range(width):
                if file.mode == 'RGB':
                    r, g, b = pixels[x, y]
                elif file.mode == 'RGBA':
                    r, g, b, a = pixels[x, y]
                r>>=4; g>>=4; b>>=4 # 8 位转 4 位
                data = data + ((r<<8)+(g<<4)+b).to_bytes(2, 'big').hex()[1:4]
        
        return data